package com.buwstudio.domain;

import javax.persistence.Entity;
import javax.persistence.Table;

import org.springframework.security.crypto.bcrypt.BCrypt;

import com.buwstudio.domain.uuid.DomainEntity;
import com.buwstudio.domain.uuid.DomainEntityOptlock;

import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
 * 
 * Description:
 * 用户领域模型
 * @author 卜 伟<br>
 * Last Modified: <br>
 * 2017年6月6日 下午4:46:40
 */
@Entity
@Table(name="bus_user")
@NoArgsConstructor(access=AccessLevel.PRIVATE) //私有化构造函数，不允许外部通过new来实例化
@Getter
@EqualsAndHashCode(callSuper = false)
public class User extends DomainEntityOptlock{

	private static final long serialVersionUID = 5273148963430635284L;



	private String username;
	
	private void setUsername(String username) {
		this.username = username;
	}
	
	private String password;
	
	/**
	 * 
	/**
	 * Description:
	 * 业务方法：密码初始化或密码修改，密码更新后会刷新密码过期时间
	 * @author 卜 伟<br>
	 * Last Modified: <br>
	 * 2017年6月6日 下午5:20:46
	 */
	public void initOrUpdatePassword(String password){
		this.password = BCrypt.hashpw(password, BCrypt.gensalt());
	}
	
	
	/**
	 * 角色
	 */
	private RoleType role;
	
	private void setRole(RoleType role) {
		this.role = role;
	}

	private Boolean enabled;
	/**
	 * 
	 * Description:
	 * 业务方法：用户创建
	 * @author 卜 伟<br>
	 * Last Modified: <br>
	 * 2017年6月6日 下午5:09:58
	 */
	public static User create(
			String username,
			String password,
			RoleType role){
		User user = new User();
		user.setUsername(username);
		user.initOrUpdatePassword(password);
		user.setRole(role);
		// 注册领域事件
//		user.registerEvent(new UserCreatedEvent(user));
		return user;
	}


	/**
	 * 角色枚举
	 */
	@Getter
	public enum RoleType {
		ROLE_ADMIN, // 超级管理员
		ROLE_MANAGER, // 主管
		ROLE_USER; // 用户
	}
	
}
